访问电脑版页面

导航:老古开发网手机版STM32单片机STM32单片机的USART

基于STM32实现串口的两个分案解析

导读:
关键字:
串口,STM32,

首先总结一下串口232,422,485

串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”,+3V~+15V逻辑“0”。

串口422:可双向传输,4线全双工,2线单工。

串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V~+6V逻辑“1”,-2V~-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。

对于串口的实现有以两个方案:

方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进入中断服务函数之后,关闭中断,接收数据,如果没有数据接收,等待一段时间(时间和波特率有关)后开中断,出中断,然后在对接收到的数据进行处理,下面看代码:

基于STM32实现串口的两个分案解析

消息队列及其初始化函数:

/*osq结构体来管理消息队列*/

typedefstructos_q{/*QUEUECONTROLBLOCK*/

u8*OSQStart;/*Pointertostartofqueuedata*/

u8*OSQEnd;/*Pointertoendofqueuedata*/

u8*OSQIn;/*PointertowherenextmessagewillbeinsertedintheQ*/

u8*OSQOut;/*PointertowherenextmessagewillbeextractedfromtheQ*/

u8OSQSize;/*Sizeofqueue(maximumnumberofentries)*/

u8OSQEntries;/*Currentnumberofentriesinthequeue*/

}OS_Q;

OS_Q*posq,osq;

u8USART_RX_BUF[length_buff];//循环队列,存储接受的信息。

voidOS_QInit()//初始化结构体

{

posq=&osq;

posq-》OSQStart=USART_RX_BUF;

posq-》OSQEnd=&USART_RX_BUF[length_buff];

posq-》OSQIn=USART_RX_BUF;

posq-》OSQOut=USART_RX_BUF;

posq-》OSQSize=length_buff;

posq-》OSQEntries=0;

}

///*在中断函数中将一条消息的所有字节一次性得保存在消息队列中*/

u8message_buff[20];

voidUSART1_IRQHandler(void)

{

u8num=0;

//u8i;

u8TIme=0;//接受超时技术

USART1-》CR1&=0XFFDF;

LED=!LED;

while(1)

{

if(USART1-》SR&(1《《5))//如果有数据收到的话,将消息存在消息队列中

{

message_buff[num]=(u8)USART1-》DR;

num++;

*posq-》OSQIn++=(u8)USART1-》DR;

posq-》OSQEntries++;

if(posq-》OSQIn==posq-》OSQEnd)

{

posq-》OSQIn=posq-》OSQStart;

}

TIme=0;

}

else

{

delay_us(10);

TIme++;

if(TIme》=50)break;

}

}

USART1-》CR1|=0X0020;

}

这样就把数据一次性全部存储下来了,剩下的就是对消息缓冲器message_buff[]中的消息进行处理了,这样就解决了消息覆盖,消息出错无法纠正的问题,至于消息怎么处理就是依据不同的需求不同的处理,另外注意,握手信号好用定时器中断。

来源:未知   作者:工程师周亮  2018/11/20 15:42:00
栏目: [ STM32单片机的USART]

相关阅读

STM32 USART串口DMA接收和发送模式

如何采用STM32单片机串口接收数据

STM32F407的UART串口初始化

STM32f103 双串口配置和中断

STM32单片机串口通讯故障排除处理过程

STM32单片机串口的定义及应用方法

STM32F4 USART配置

STM32单片机串口波特率的计算方法解析

基于STM32单片机发送字符串的函数

如何利用STM32单片机串口发送字符串

STM32单片机重映射USART设计

STM32单片机UART发送配置的步骤及方法

如何在STM32串口通信程序中使用printf发送数据

基于STM32单片机的串口使用解析

什么是串口通信?基于STM32的printf打印输出

基于STM32F4单片机USART寄存器控制的设计

基于STM32中调试与串口之间的信息传输

基于STM32实现串口的两个分案解析

STM32单片机串口DMA解析

以STM32单片机为核心实现了串口与EM310数据传输的无线终端设计